package main.leetcode.clockin.March;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 225.用队列实现栈
 *
 * <p>使用队列实现栈的下列操作：
 *
 * <p>push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空
 *
 * <p>注意:
 *
 * <p>你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
 * 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque（双端队列）来模拟一个队列 , 只要是标准的队列操作即可。 你可以假设所有操作都是有效的（例如, 对一个空的栈不会调用
 * pop 或者 top 操作）。
 *
 * <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/implement-stack-using-queues
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class day1 {
    public static void main(String[] args) {
        day1 myStack = new day1();
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        System.out.println(myStack.top());
        System.out.println(myStack.pop());
        System.out.println(myStack.top());
        System.out.println(myStack.pop());
        System.out.println(myStack.empty());
    }

    // 双队列实现
    //  private Queue<Integer> queueA;
    //  private Queue<Integer> queueB;
    //  private int top;
    //
    //  /** Initialize your data structure here. */
    //  public ex225() {
    //    queueA = new LinkedList<>();
    //    queueB = new LinkedList<>();
    //  }
    //
    //  /** Push element x onto stack. */
    //  public void push(int x) {
    //    queueA.add(x);
    //    top = x;
    //  }
    //
    //  /** Removes the element on top of the stack and returns that element. */
    //  public int pop() {
    //    while (queueA.size() > 1) {
    //      top = queueA.remove();
    //      queueB.add(top);
    //    }
    //    Queue<Integer> tmp = queueA;
    //    queueA = queueB;
    //    queueB = tmp;
    //    return queueB.remove();
    //  }
    //
    //  /** Get the top element. */
    //  public int top() {
    //    return top;
    //  }
    //
    //  /** Returns whether the stack is empty. */
    //  public boolean empty() {
    //    return queueA.isEmpty();
    //  }

    // 单队列实现
    private Queue<Integer> queue;

    /** Initialize your data structure here. */
    public day1() {
        queue = new LinkedList<>();
    }

    /** Push element x onto stack. */
    public void push(int x) {
        queue.add(x);
        int size = queue.size();
        // 压入1=>1；再压入2=>1,2=>2,1；再压入3=>2,1,3=>3,2,1
        for (int i = 1; i < size; i++) queue.add(queue.remove());
    }

    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
        return queue.remove();
    }

    /** Get the top element. */
    public int top() {
        return queue.peek();
    }

    /** Returns whether the stack is empty. */
    public boolean empty() {
        return queue.isEmpty();
    }
}

/**
 * Your MyStack object will be instantiated and called as such: MyStack obj = new MyStack();
 * obj.push(x); int param_2 = obj.pop(); int param_3 = obj.top(); boolean param_4 = obj.empty();
 */
